home *** CD-ROM | disk | FTP | other *** search
/ Assassins - Ultimate CD Games Collection 4 / Assassins 4 (1999)(Weird Science).iso / misc / omega / source / abyss.c next >
Encoding:
C/C++ Source or Header  |  1997-05-02  |  4.4 KB  |  218 lines

  1. /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
  2. /* abyss.c */
  3. /* some functions to make the abyss level and run the final challenge */
  4.  
  5. #ifdef MSDOS
  6. #include <sys/types.h>
  7. #include <malloc.h>
  8. #ifdef SAVE_LEVELS
  9. #include <sys/timeb.h>
  10. #include <dos.h>
  11. #endif
  12. #endif
  13.  
  14. #include "glob.h"
  15.  
  16. /* loads the abyss level into Level*/
  17. void load_abyss()
  18. {
  19.   int i,j;
  20.   char site;
  21.   
  22.   FILE *fd;
  23.   
  24.   TempLevel = Level;
  25.   if (ok_to_free(TempLevel)) {
  26. #ifndef SAVE_LEVELS
  27.     free_level(TempLevel);
  28. #endif
  29.     TempLevel = NULL;
  30.   }
  31. #ifndef SAVE_LEVELS
  32.   Level = ((plv) checkmalloc(sizeof(levtype)));
  33. #else
  34.   msdos_changelevel(TempLevel,0,-1);
  35.   Level = &TheLevel;
  36. #endif
  37.   
  38.   clear_level(Level);
  39.  
  40.   strcpy(Str3,Omegalib);
  41.   strcat(Str3,"abyss.dat");
  42.   fd = checkfopen(Str3,"rb");
  43.   site = cryptkey("abyss.dat");
  44.   for(j=0;j<LENGTH;j++) {
  45.     for(i=0;i<WIDTH;i++) {
  46.       site = getc(fd)^site;
  47.       Level->site[i][j].roomnumber = RS_ADEPT;
  48.       switch(site) {
  49.       case '0':
  50.     Level->site[i][j].locchar = VOID_CHAR;
  51.     Level->site[i][j].p_locf = L_VOID;
  52.     break;
  53.       case 'V':
  54.     Level->site[i][j].locchar = VOID_CHAR;
  55.     Level->site[i][j].p_locf = L_VOID_STATION;
  56.     break;
  57.       case '1':
  58.     Level->site[i][j].locchar = FLOOR;
  59.     Level->site[i][j].p_locf = L_VOICE1;
  60.     break;
  61.       case '2':
  62.     Level->site[i][j].locchar = FLOOR;
  63.     Level->site[i][j].p_locf = L_VOICE2;
  64.     break;
  65.       case '3':
  66.     Level->site[i][j].locchar = FLOOR;
  67.     Level->site[i][j].p_locf = L_VOICE3;
  68.     break;
  69.       case '~':
  70.     Level->site[i][j].locchar = WATER;
  71.     Level->site[i][j].p_locf = L_WATER_STATION;
  72.     break;
  73.       case ';':
  74.     Level->site[i][j].locchar = FIRE;
  75.     Level->site[i][j].p_locf = L_FIRE_STATION;
  76.     break;
  77.       case '"':
  78.     Level->site[i][j].locchar = HEDGE;
  79.     Level->site[i][j].p_locf = L_EARTH_STATION;
  80.     break;
  81.       case '6':
  82.     Level->site[i][j].locchar = WHIRLWIND;
  83.     Level->site[i][j].p_locf = L_AIR_STATION;
  84.     break;
  85.       case '#':
  86.     Level->site[i][j].locchar = WALL;
  87.     break;
  88.       case '.':
  89.     Level->site[i][j].locchar = FLOOR;
  90.     break;
  91.       }
  92.     }
  93.     site = getc(fd)^site;
  94.   }
  95.   fclose(fd);
  96. }
  97.  
  98.  
  99. #ifdef SAVE_LEVELS
  100. /* This stuff is in this file because the file was really small. */
  101.  
  102. void msdos_init()
  103. {
  104.     int i;
  105.  
  106.     /* Allocate the inner level of pointers for TheLevel */
  107.     for (i = 0; i < MAXWIDTH; i++)
  108.         TheLevel.site[i] = (plc)checkmalloc(MAXLENGTH * sizeof(loctype));
  109.  
  110.     /* Remove old level files */
  111.     kill_all_levels();
  112. }
  113.  
  114. void kill_all_levels()
  115. {
  116.     kill_levels("om*.lev");
  117. }
  118.  
  119. void kill_levels(str)
  120. char *str;
  121. {
  122.     int i;
  123.     struct find_t buf;
  124.  
  125.     /* Remove old level files laying around */
  126.     sprintf(Str1,"%s%s",Omegalib,str);
  127.     for (i = _dos_findfirst(Str1,_A_NORMAL,&buf); !i; i = _dos_findnext(&buf))
  128.     {
  129.         sprintf(Str2,"%s%s",Omegalib,buf.name);
  130.     remove(Str2);
  131.     }
  132. }
  133.  
  134. #define MEM_CHECK_AMOUNT 0xf000
  135. void check_memory()
  136. {
  137.     char *mems[50];
  138.     long amount = 0;
  139.     int num_mems = 0;
  140.     unsigned try;
  141.  
  142.     sprintf(Str1,"Heapchk returned %d.",_heapchk());
  143.     mprint(Str1);
  144.  
  145.     try = MEM_CHECK_AMOUNT;
  146.     while (try > 10000)
  147.     {
  148.         while (try > 0 && (mems[num_mems] = checkmalloc(try)) == NULL)
  149.         try -= 0x400;
  150.     amount += try;
  151.     num_mems++;
  152.     }
  153.     while (--num_mems >= 0)
  154.         if (mems[num_mems] != NULL)
  155.         free(mems[num_mems]);
  156.  
  157.     sprintf(Str1,"Free mem approx %dK",(int)(amount / 0x400));
  158.     mprint(Str1);
  159. }
  160.  
  161. static FILE *open_levfile(env,depth,rw)
  162. int env,depth,rw;
  163. {
  164.     sprintf(Str1,"%som%03d%03d.lev",Omegalib,env,depth);
  165.     return(fopen(Str1,(rw) ? "wb" : "rb"));
  166. }
  167.  
  168. /* Saves oldlevel (unless NULL), and reads in the new level,
  169.    unless depth is < 0. */
  170. plv msdos_changelevel(oldlevel,newenv,newdepth)
  171. plv oldlevel;
  172. int newenv,newdepth;
  173. {
  174.     FILE *fp;
  175.  
  176.     if (oldlevel != NULL)
  177.     {
  178.         if (oldlevel->environment == newenv &&
  179.       oldlevel->depth == newdepth)
  180.         return(oldlevel);
  181.         if ((fp = open_levfile(oldlevel->environment,oldlevel->depth,1)) != NULL)
  182.     {
  183.         save_level(fp,oldlevel);
  184.         fclose(fp);
  185.     }
  186.     else
  187.         mprint("Cannot save level!!!");
  188.     /* Free up monsters and items */
  189.     free_level(oldlevel);
  190.     }
  191.     if (newdepth >= 0)
  192.     {
  193.         if ((fp = open_levfile(newenv,newdepth,0)) == NULL)
  194.         return(NULL);
  195.     restore_level(fp);
  196.     fclose(fp);
  197.     return(Level);
  198.     }
  199.     return(NULL);
  200. }
  201.  
  202. #endif
  203.  
  204. #ifdef DJGPP
  205.  
  206. void check_memory()
  207. {
  208.   clear_screen();
  209.   print1("There should be over 300 K free on the drive.");  
  210.   print2("Save _before_ the free space gets below 300 K.");
  211.   morewait();
  212.   system("dir");
  213.   morewait();
  214.   clear_screen();
  215.   xredraw();
  216. }
  217. #endif
  218.